package com.szrt.javaweb.file;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/upload.do")
public class UploadController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//1 解析析请求，得到一个FileItem 对象组成的List
		
		
		//创建一个生成FileItem的工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置内存中可以最多存放的上传文件的大小、如果超过这个值就会写入到一个临时文件夹中。以byte为单位  这里设置为500KB
		factory.setSizeThreshold(1024*500);
		
		File tempDirectory = new File("D:/tempDirectory");

		//设置临时文件夹
		factory.setRepository(tempDirectory);

		//Create a new file upload handler
		ServletFileUpload upload = new ServletFileUpload(factory);

		// Set overall request size constraint
		//整个上传的文件的总的大小 默认是-1 没有限制  单位byte
		//也就是说一次性可以上传比如5个文件。但是这5个文件加起来比如不能超过10M
		upload.setSizeMax(1024 * 1024 * 10);


		//设置单个文件的大小 比如不超过1M
		upload.setFileSizeMax(1024 * 1024);

		//解析请求
		List<FileItem> items = null;
		try {
			//因为子类不能抛出比父类更大的异常。所以只能自己捕获、不能抛出异常。
			items = upload.parseRequest(request);
			
			//2 遍历这个List 如果是一般的表单域  保存到数据库中  如果是一个文件域 把文件保存到 D盘下面的files目录下
			
			for(FileItem item: items){
				
				if(item.isFormField()){
					//说明是一般的表单域
					String name = item.getFieldName();
					String value= item.getString(); //默认编码为：ISO-8859-1
					System.out.print("name="+name +",value="+value);
				}else{
					//说明是一般的文件域
					String fieldName   = item.getFieldName();
				    String fileName    = item.getName();
				    String contentType = item.getContentType();
				    boolean isInMemory = item.isInMemory();
				    long sizeInBytes   = item.getSize();
				    
				    System.out.println(fieldName);
				    System.out.println(fileName);
				    System.out.println(contentType);
				    System.out.println(isInMemory);
				    System.out.println(sizeInBytes);
				    
				    InputStream is =item.getInputStream();
				    
				    //把字节流写入到指定的文件
				    byte[] b = new byte[1024];
				    
				    int len=0;
				    
				    fileName ="d:/files/"+fileName;
				    System.err.println(fileName);
				    OutputStream os = new FileOutputStream(fileName);
				    
				    while((len=is.read(b))!=-1){
				    	os.write(b, 0, len);
				    }
				    
				    //关闭流
				    os.close();
				    is.close();
				    

				}
				
			}
			
		} catch (FileUploadException e) {
			e.printStackTrace();
		}

		
		
		
		
		
		
	}

}
